package com.swdegao.iot.netty.server.qianbaotonghandler;

import lombok.Data;
import lombok.ToString;

import java.math.BigDecimal;

/**
 * 千宝通通协议实体类
 *
 * @author TsingYu
 * @version 1.0
 * @date 2024/10/29 10:12
 */
@Data
@ToString
public class QianBaoTongModel {
    /**
     * TCP/IP识别包头
     */
    private byte[] identifiesPacketHeaders;
    /**
     * 集中器地址
     */
    private String concentratorAddr;
    /**
     * 集中器地址（原始值）
     */
    private byte[] concentratorAddrRaw;
    /**
     * 发送（接收）数据包头
     */
    private byte[] dataPacketHeaders;
    /**
     * 控制码
     */
    private byte[] controlCode;
    /**
     * 采集器地址
     */
    private String collectorAddr;
    /**
     * 采集器地址（原始值）
     */
    private byte[] collectorAddrRaw;
    /**
     * 表地址
     */
    private String meterAddr;
    /**
     * 表地址（原始值）
     */
    private byte[] meterAddrRaw;
    /**
     * 表读数
     */
    private BigDecimal meterReadingNumber;
    /**
     * 表读数（原始值）
     */
    private byte[] meterReadingNumberRaw;
    /**
     * 表状态
     */
    private CommunicationStatus meterStatus;
    /**
     * 表状态（原始值）
     */
    private Byte meterStatusRaw;
    /**
     * 页面号
     */
    private Byte pageNum;
    /**
     * 集中器信息（原始值）
     */
    private byte[] concentratorRaw;
    /**
     * 集中器信息
     */
    private Concentrator concentrator;
    /**
     * crc校验和
     */
    private byte[] crc;
    /**
     * 结束字符
     */
    private Byte endChar;
    /**
     * 采集器编号信息
     */
    private String[] collectorAddresses;
    /**
     * 采集器编号信息（原始值）
     */
    private byte[] collectorAddressesRaw;
    /**
     * 表信息（原始值）
     */
    private byte[] metersRaw;
    /**
     * 表信息
     */
    private Meter[] meters;

    /**
     * 通讯状态
     */
    @ToString
    public enum CommunicationStatus {
        /**
         * 正常
         */
        NORMAL((byte) 0x4F, "正常"),
        /**
         * 读表失败
         */
        READING_FAILURE((byte) 0x4D, "读表失败"),
        /**
         * 采集器异常
         */
        COLLECTOR_ABNORMAL((byte) 0x4A, "采集器异常"),
        /**
         * 正常且阀门关闭
         */
        VALVE_CLOSED((byte) 0x43, "正常且阀门关闭");

        private final byte code;
        private final String msg;

        CommunicationStatus(byte code, String msg) {
            this.code = code;
            this.msg = msg;
        }


        public static CommunicationStatus getStatus(byte code) {
            for (CommunicationStatus status : CommunicationStatus.values()) {
                if (status.code == code) {
                    return status;
                }
            }
            return null;
        }
    }

    /**
     * 集中器信息
     */
    @Data
    public static class Concentrator {
        /**
         * AT指令，对无线集中器无用
         */
        private byte[] atInstruction;
        /**
         * 定时抄表（原始值）
         */
        private byte[] timingReadingRaw;
        /**
         * 定时抄表
         */
        private String timingReading;
        /**
         * 设备时钟（原始值）
         */
        private byte[] clockRaw;
        /**
         * 设备时钟
         */
        private String clock;
        /**
         * 历史记录（原始值）<br>
         * A*yyyymmddhhmmss<br>
         * 或A-yyyymmddhhmmss12个记录，第一位从A到T<br>
         * （每个记录第一个字符为A到T表示序号，第二个字母为当前已抄表项则用*表示，其他项用-表示，后面为年月日时分秒字母）<br>
         * 每个记录16个字节,共12条<br>
         */
        private byte[] historyRecordsRaw;
        /**
         * 历史记录<br>
         * A*yyyymmddhhmmss<br>
         * 或A-yyyymmddhhmmss12个记录，第一位从A到T<br>
         * （每个记录第一个字符为A到T表示序号，第二个字母为当前已抄表项则用*表示，其他项用-表示，后面为年月日时分秒字母）<br>
         * 每个记录16个字节,共12条<br>
         */
        private String[] historyRecords;
        /**
         * 备注信息（原始值），描述集中器的一般信息
         */
        private byte[] remarkRaw;
        /**
         * 备注信息，描述集中器的一般信息
         */
        private String remark;
    }

    /**
     * 表信息
     */
    @Data
    @ToString
    public static class Meter{
        /**
         * 采集器序号
         */
        private Byte collectorIndex;
        /**
         * 表地址
         */
        private String meterAddr;
        /**
         * 表地址（原始值）
         */
        private byte[] meterAddrRaw;
        /**
         * 表读数
         */
        private BigDecimal meterReadingNumber;
        /**
         * 表读数（原始值）
         */
        private byte[] meterReadingNumberRaw;
        /**
         * 表状态
         */
        private Byte meterStatusRaw;
        /**
         * 表状态
         */
        private CommunicationStatus meterStatus;
    }
}
